---
title: gitlab
date: '2024-10-31'
tags: ['gitlab']
draft: false
summary: "GitLab 是一个基于 Git 的开源仓库管理系统,代码管理(版本控制、代码审查、Web IDE)、项目管理(任务看板、里程碑设定、甘特图)、CI/CD 集成(自动化构建与测试、多环境部署，但是免费版本受次数限制)、安全管理(安全扫描、权限控制)、知识管理(Wiki 功能、代码片段收集)"
# images: ['/static/images/twitter-card.png']
---


**目录**   
- [Ubuntu 安装](#Ubuntu-安装) 
- [Debian 安装](#Debian-安装)
- [Contos7-安装](#Contos7-安装)
- [docker-安装](#docker-安装)
- [常用命令](#常用命令)
- [gitlab汉化](#gitlab汉化)
- [gitlab安装目录](#gitlab安装目录)
- [绑定邮箱](#绑定邮箱)
- [设置备份](#设置备份)

[官方安装文档](https://gitlab.cn/install/?version=ce)

**注意：出于安全原因，24 小时后，/etc/gitlab/initial_root_password 会被第一次 gitlab-ctl reconfigure 自动删除，因此若使用随机密码登录，建议安装成功初始登录成功之后，立即修改初始密码。**

> 注意： 下面的 EXTERNAL_URL 需要替换成自己的域名或者ip地址。

### 常见系统服务器的安装

#### Ubuntu-安装

Ubuntu是linux的发行版，安装gitlab的方式也有很多，这里介绍一下Ubuntu的安装方式。

1. 安装依赖
```bash
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates tzdata perl

（可选）如果要使用 Postfix 来发送电子邮件通知，执行以下安装命令。

sudo apt-get install -y postfix

```

2.下载gitlab安装包

```shell
curl -L get.gitlab.cn | bash

sudo EXTERNAL_URL="https://gitlab.example.com" apt-get install -y gitlab-jh

```



#### Debian-安装   

Debian是linux的发行版，是继centos停止更新后比较火的系统。
1. 安装依赖
```bash
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates tzdata perl

（可选）如果要使用 Postfix 来发送电子邮件通知，执行以下安装命令。

sudo apt-get install -y postfix

```

2.下载gitlab安装包

```shell
curl -L get.gitlab.cn | bash

sudo EXTERNAL_URL="https://gitlab.example.com" apt-get install -y gitlab-jh

```
[⬆ 回顶部](#)


#### CentOS7-安装   

CentOS 是linux的发行版，是最经典稳定的系统。 **当前以版本7为例**  

还是踩了挺多坑的： 
- win11 不支持 VMware Workstation 17以下版本，需要升级到17以上版本。
- 之前的centos 7版本ios文件 安装完成后有软件安装问题，需要安装镜像更新。 
   -  `curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo`
   - 下载完成后，运行 `yum clean all` 来清除yum缓存，然后再尝试执行yum install - y curl policycoreutils - python openssh - server perl命令

1. 安装依赖
```bash

sudo yum install -y curl policycoreutils-python openssh-server perl
sudo systemctl enable sshd
sudo systemctl start sshd
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo systemctl reload firewalld

（可选）如果要使用 Postfix 来发送电子邮件通知，执行以下安装命令。

sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
```
![yum install -y curl policycoreutils-python openssh-server perl](/static/images/gitlab/20250104182707.png)
要安静等待安装完成
![成功显示](/static/images/gitlab/20250104191043.png)
2.下载gitlab安装包

```shell
curl -L get.gitlab.cn | bash

sudo EXTERNAL_URL="https://gitlab.example.com" yum install -y gitlab-jh

```
**注意**
若是安装过程报安装源列表或者镜像问题可以更新阿里云的镜像
```shell
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

```
安装时间比较久，耐心等待安装完成
![](/static/images/gitlab/202501041959.jpg)
安装过程及其完成展示

**遇到的问题**
安装完成之后，启动服务 systemctl status gitlab -runner 报错

>  Failed to start gitlab.service: Unit not found

解决方法：先不要卸载，因为文件比较大 4G ，卸载之后再安装比较浪费时间。
```shell
1、先执行判断是否已经安装gitlab
rpm -qa|grep gitlab
yum search gitlab        #查看是否已经安装gitlab

2、如果已经安装gitlab，查看安装位置
rpm -ql gitlab-jh-17.7.0-jh.0.el7.x86_64
# gitlab-jh-17.7.0-jh.0.el7.x86_64 是完整的gitlab安装包

发现 gitlab 不是以前安装的 /etc/gitlab 目录，而是 /opt/gitlab 目录，所以需要按照路径指向运行命令

3、运行gitlab 
# 按照百度查询命令
/opt/gitlab/bin/gitlab-rails server - e production
# 还是报错
/opt/gitlab/bin/gitlab-rails error: could not load /opt/gitlab/etc/gitlab-rails-rc
Either you are not allowed to read the file, or it does not exist yet.
You can generate it with:   sudo gitlab-ctl reconfigure

gitlab-ctl reconfigure
# 执行了将近半小时，耐心等待

4、再次运行gitlab

发现不能访问页面，后面发现是防火墙的问题，默认访问 80 端口，需要开放80端口。

firewall-cmd --zone=public --add-port=80/tcp --permanent
# 开启一个端口（–permanent 永久生效，没有此参数重 启后失效）

因为是本地项目，所以可以直接关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

```
**所以在安装完成后要 gitlab-ctl reconfigure 执行下服务，若是在安装的时候没有 加入命令` EXTERNAL_URL="http://example.com"` 配置默认的链接还要再 `/etc/gitlab/gitlab.rb`文件下修改 external_url的路径,然后 gitlab-ctl stop 停止服务，记得 gitlab-ctl reconfigure 更新下gitlab配置然后 gitlab-ctl start**

我在 `C:\Windows\System32\drivers\etc\hosts` 修改了本地host，可以直接输入自定义域名访问 
```shell
192.168.0.1    mygitlab.com
```
[⬆ 回顶部](#)

#### docker-安装 

[安装文档](https://gitlab.cn/docs/jh/install/docker.html)
当前为centos7 安装docker
**前置条件**

- 4G以上内存
- 系统在3.10以上版本   `uname -r` 查询
- 更新 yum 源  `yum update`
- 安装依赖 `yum install -y yum-utils device-mapper-persistent-data lvm2`
- 国外镜像：`yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo`
- 阿里镜像:`yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo`
- 查看可以运行的版本：`yum list docker-ce --showduplicates | sort -r`
- 安装指定版本：`yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io`
  - eg:`yum install docker-ce-26.1.4-1.el7`

```shell
# ，将路径设置为 /srv/gitlab
export GITLAB_HOME=/srv/gitlab

sudo docker run --detach \
  --hostname 192.168.64.131 \
  --publish 443:443 --publish 80:80 --publish 2222:22 \ 
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  --shm-size 256m \
  registry.gitlab.cn/omnibus/gitlab-jh:latest

  # 修改22为2222作为gitlab的ssh端口,不要默认使用22端口
  # --restart always 容器重启后自动启动
  #--volume：即使容器被删除或重新创建，GitLab 的配置、日志和数据也不会丢失。
  # 若是报错就换成一行命令
  sudo docker run --detach --hostname 192.168.64.131 --publish 443:443 --publish 80:80 --publish 2222:22  --name gitlab --restart always  --volume $GITLAB_HOME/config:/etc/gitlab --volume $GITLAB_HOME/logs:/var/log/gitlab --volume $GITLAB_HOME/data:/var/opt/gitlab  --shm-size 256m  registry.gitlab.cn/omnibus/gitlab-jh:latest
```
- 查看安装：`docker ps -a`

**坑点：**

- 端口占用问题(使用了默认配置的22端口)
  - 查看端口占用 `netstat -tuln`
  - 停运容器 `docker stop gitlab`
  - 移除容器 `docker rm gitlab`
  - 删除镜像（可选,想重新拉取最新的镜像或者更换镜像版本）`docker rmi gitlab`
  - 若是执行删除镜像： `docker pull registry.gitlab.cn/omnibus/gitlab-jh:latest`
  - 重新运行容器 `docker run --detach  --hostname 192.168.64.131  --publish 443:443 --publish 80:80 --publish 2222:22  --name gitlab --restart always  --volume $GITLAB_HOME/config:/etc/gitlab  --volume $GITLAB_HOME/logs:/var/log/gitlab  --volume $GITLAB_HOME/data:/var/opt/gitlab  --shm-size 256m  registry.gitlab.cn/omnibus/gitlab-jh:latest`


> 最后可以查看容器 docker exec -it gitlab2 /bin/bash   
> 退出容器：exit 或 ctrl + d

打开 192.168.64.131 ，等的时间可能有点久 10多分钟，看个人电脑配置 


<br/>
<br/>
<br/>
[⬆ 回顶部](#)

#### 常用命令   

```shell

gitlab-ctl start               #启动所有git1ab组件：
gitlab-ctl stop                #停止所有git1ab组件：
gitlab-ctl restart             #重启所有git1ab组件：
gitlab-ctl status              #查看服务状态：

gitlab-ctl reconfigure         #启动服务：
vi /etc/gitlab/gitlab.rb       #修改默认的配置文件：
gitlab-ctl tail                #查看日志：

gitlab-ctl help                                #帮助
gitlab-rake gitlab:check SANITIZE=true --trace	检查gitlab
#gitlab 默认的日志文件存放在/var/log/gitlab 目录下
gitlab-ctl tail                                #查看所有日志
#禁止 Gitlab 开机自启动
systemctl disable gitlab-runsvdir.service 
#启用 Gitlab 开机自启动
systemctl enable gitlab-runsvdir.service

```
[⬆ 回顶部](#)

#### gitlab汉化
![gitlab汉化](/static/images/gitlab/20250111212405.png)

#### gitlab安装目录   
若是docker安装的gitlab，请进入容器内部执行命令`docker exec -it gitlab /bin/bash`
```shell
gitlab组件日志路径：/var/log/gitlab

gitlab配置路径：/etc/gitlab/  路径下有gitlab.rb配置文件

应用代码和组件依赖程序：/opt/gitlab

各个组件存储路径： /var/opt/gitlab/

仓库默认存储路径   /var/opt/gitlab/git-data/repositories

版本文件备份路径：/var/opt/gitlab/backups/

nginx安装路径：/var/opt/gitlab/nginx/

redis安装路径：/var/opt/gitlab/redis
```
[⬆ 回顶部](#)

#### 创建密钥（免密登录）   

在自己的电脑上创建密钥（**非虚拟机**）

> ssh-keygen

![gitlab创建密钥](/static/images/gitlab/20250104232109.png)

完成之后，自己的电脑上会生成一个.ssh文件夹，里面有两个文件，id_rsa和id_rsa.pub，id_rsa.pub就是公钥，id_rsa就是私钥。

![gitlab添加密钥](/static/images/gitlab/20250105003745.png)

添加之后，从gitlab拉取和提交代码 使用 SSH 克隆的时候就不需要输入密码了。
[⬆ 回顶部](#)

#### 绑定邮箱    
[⬆ 回顶部](#)

在 `/etc/gitlab/gitlab.rb`文件修改配置，添加邮箱配置。 建一个服务器邮箱，开启IMAP/SMTP服务
huxiangwuyou@aliyun.com
```shell

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.aliyun.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "huxiangwuyou@aliyun.com"
gitlab_rails['smtp_password'] = "开启IMAP/SMTP服务授权码"
gitlab_rails['smtp_domain'] = "aliyun.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['smtp_pool'] = false


gitlab_rails['gitlab_email_from'] = 'huxiangwuyou@aliyun.com'


user['git_user_email'] = "huxiangwuyou@aliyun.com"

```

**测试邮箱**   [⬆ 回顶部](#)

>1、重新加载
`gitlab-ctl reconfigure`

>2、打开控制台
`gitlab-rails console`

>3、测试邮箱
Notify.test_email('123456789@qq.com', '邮件标题', '邮件内容').deliver_now


<br/>
<br/>
<br/>

#### 配置gitlab

```yaml
image: registry.cn-hangzhou.aliyuncs.com/cicd/base:0.1.9

stages:
  - dev_build
  - test_build
  - stage_build
  - demo_build
  - press_build

dev_build:
  tags:
    - i-commerce
  stage: dev_build
  only:
    - tags
    - ci
    - dev
    - /^feature.*$/
  script:
    - npm run clean-dist
    - yarn install --registry http://npm.taobao.org/mirrors --sass-binary-site=http://npm.taobao.org/mirrors/node-sass
    - chmod -R 777 node_modules
    - npm run yunxi-dev

    - mc config host add minio ${MINIO_URL} ${MINIO_USER} ${MINIO_PASSWORD} S3v4
    - mc mb -p minio/idp
    - mc policy public minio/idp
    - mkdir -p /cache/${CI_PROJECT_NAME}-${CI_PROJECT_ID}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}/dist
    - cp -r dist  $CI_PROJECT_DIR/docker/  &&  cp -r dist /cache/${CI_PROJECT_NAME}-${CI_PROJECT_ID}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}/dist 
    - zip -q -r dist.zip dist/
    - mc cp --recursive dist.zip minio/idp/${GROUP_NAME}/${PROJECT_NAME}/${CI_COMMIT_TAG}/
    - kaniko --skip-tls-verify -c $CI_PROJECT_DIR/docker -f $CI_PROJECT_DIR/docker/Dockerfile -d ${DOCKER_REGISTRY}/${GROUP_NAME}/${PROJECT_NAME}:${CI_COMMIT_TAG}
    - chart_build

test_build:
  tags:
    - i-commerce
  stage: test_build
  only:
    - tags
    - ci
    - /^release.*$/
  script:
    - npm run clean-dist
    - yarn install --registry http://npm.taobao.org/mirrors --sass-binary-site=http://npm.taobao.org/mirrors/node-sass
    - chmod -R 777 node_modules
    - npm run yunxi-test

    - mc config host add minio ${MINIO_URL} ${MINIO_USER} ${MINIO_PASSWORD} S3v4
    - mc mb -p minio/idp
    - mc policy public minio/idp
    - mkdir -p /cache/${CI_PROJECT_NAME}-${CI_PROJECT_ID}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}/dist
    - cp -r dist  $CI_PROJECT_DIR/docker/  && cp -r dist /cache/${CI_PROJECT_NAME}-${CI_PROJECT_ID}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}/dist  
    - zip -q -r dist.zip dist/
    - mc cp --recursive dist.zip minio/idp/${GROUP_NAME}/${PROJECT_NAME}/${CI_COMMIT_TAG}/
    - kaniko --skip-tls-verify -c $CI_PROJECT_DIR/docker -f $CI_PROJECT_DIR/docker/Dockerfile -d ${DOCKER_REGISTRY}/${GROUP_NAME}/${PROJECT_NAME}:${CI_COMMIT_TAG}
    - chart_build

stage_build:
  tags:
    - i-commerce
  stage: stage_build
  only:
    - tags
    - ci
    - /^stage.*$/
  script:
    - npm run clean-dist
    - yarn install --registry http://npm.taobao.org/mirrors --sass-binary-site=http://npm.taobao.org/mirrors/node-sass
    - chmod -R 777 node_modules
    - npm run yunxi-stage

    - mc config host add minio ${MINIO_URL} ${MINIO_USER} ${MINIO_PASSWORD} S3v4
    - mc mb -p minio/idp
    - mc policy public minio/idp
    - mkdir -p /cache/${CI_PROJECT_NAME}-${CI_PROJECT_ID}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}/dist
    - cp -r dist  $CI_PROJECT_DIR/docker/  && cp -r dist /cache/${CI_PROJECT_NAME}-${CI_PROJECT_ID}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}/dist  
    - zip -q -r dist.zip dist/
    - mc cp --recursive dist.zip minio/idp/${GROUP_NAME}/${PROJECT_NAME}/${CI_COMMIT_TAG}/
    #- kaniko --skip-tls-verify -c $CI_PROJECT_DIR/docker -f $CI_PROJECT_DIR/docker/Dockerfile -d ${DOCKER_REGISTRY}/${GROUP_NAME}/${PROJECT_NAME}:${CI_COMMIT_TAG}
    - chart_build

demo_build:
  tags:
    - i-commerce
  stage: demo_build
  only:
    - tags
    - ci
    - /^demo.*$/
  script:
    - npm run clean-dist
    - yarn install --registry http://npm.taobao.org/mirrors --sass-binary-site=http://npm.taobao.org/mirrors/node-sass
    - chmod -R 777 node_modules
    - npm run yunxi-demo

    - mc config host add minio ${MINIO_URL} ${MINIO_USER} ${MINIO_PASSWORD} S3v4
    - mc mb -p minio/idp
    - mc policy public minio/idp
    - mkdir -p /cache/${CI_PROJECT_NAME}-${CI_PROJECT_ID}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}/dist
    - cp -r dist  $CI_PROJECT_DIR/docker/  &&  cp -r dist /cache/${CI_PROJECT_NAME}-${CI_PROJECT_ID}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}/dist  
    - zip -q -r dist.zip dist/
    - mc cp --recursive dist.zip minio/idp/${GROUP_NAME}/${PROJECT_NAME}/${CI_COMMIT_TAG}/
    #- kaniko --skip-tls-verify -c $CI_PROJECT_DIR/docker -f $CI_PROJECT_DIR/docker/Dockerfile -d ${DOCKER_REGISTRY}/${GROUP_NAME}/${PROJECT_NAME}:${CI_COMMIT_TAG}
    - chart_build

press_build:
  tags:
    - i-commerce
  stage: press_build
  only:
    - tags
    - ci
    - /^press.*$/
  script:
    - npm run clean-dist
    - yarn install --registry http://npm.taobao.org/mirrors--sass-binary-site=http://npm.taobao.org/mirrors/node-sass
    - chmod -R 777 node_modules
    - npm run yunxi-press

    - mc config host add minio ${MINIO_URL} ${MINIO_USER} ${MINIO_PASSWORD} S3v4
    - mc mb -p minio/idp
    - mc policy public minio/idp
    - mkdir -p /cache/${CI_PROJECT_NAME}-${CI_PROJECT_ID}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}/dist
    - cp -r dist  $CI_PROJECT_DIR/docker/  && cp -r dist /cache/${CI_PROJECT_NAME}-${CI_PROJECT_ID}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}/dist  
    - zip -q -r dist.zip dist/
    - mc cp --recursive dist.zip minio/idp/${GROUP_NAME}/${PROJECT_NAME}/${CI_COMMIT_TAG}/
    - kaniko --skip-tls-verify -c $CI_PROJECT_DIR/docker -f $CI_PROJECT_DIR/docker/Dockerfile -d ${DOCKER_REGISTRY}/${GROUP_NAME}/${PROJECT_NAME}:${CI_COMMIT_TAG}
    - chart_build


.auto_devops: &auto_devops |
  http_status_code=`curl -o .auto_devops.sh -s -m 10 --connect-timeout 10 -w %{http_code} "${CHOERODON_URL}/devops/ci?token=${Token}&type=front"`
  if [ "$http_status_code" != "200" ]; then
    cat .auto_devops.sh
    exit 1
  fi
  source .auto_devops.sh
  cat .auto_devops.sh

before_script:
  - *auto_devops
```

#### 设置备份

> 暂不研究


[⬆ 回顶部](#)